#include "Thread.hpp" 
#include "LockGuard.hpp"
#include <vector>
#include <pthread.h>

void threadrun(const std::string& name, pthread_mutex_t* lock) {
    // const char* name = static_cast<const char*>(args);
    while (true) {
        std::cout << name << " is running" << std::endl;
        sleep(1);
    }
}

pthread_mutex_t gmtx = PTHREAD_MUTEX_INITIALIZER;
int gtickets = 1000;

void BuyTickets(const std::string& name, pthread_mutex_t* lock) {
    while (true) {
        // 全局锁
        // pthread_mutex_lock(&gmtx);
        // pthread_mutex_lock(lock);

        // 使用 lockguard 封装
        LockGuard lockguard(lock);
        if (gtickets > 0) {
            std::cout << "who: " << name << ", get a ticket:" << gtickets << std::endl;

            gtickets--;
            
            usleep(1000); // 1ms 表示抢票时间
            // 全局锁
            // pthread_mutex_unlock(&gmtx);
            // 局部锁
            // pthread_mutex_unlock(lock);
        } else {
            // 全局锁
            // pthread_mutex_unlock(&gmtx);
            // 局部锁
            // pthread_mutex_unlock(lock);
            break;
        }

    } 
}

const int tnum = 5;

int main() {
    // new 出一个mutex
    pthread_mutex_t* pmtx = new pthread_mutex_t;
    // std::cout << pmtx << std::endl;

    // sleep(5);

    pthread_mutex_init(pmtx, nullptr); 
    Thread t1(BuyTickets, "thread-1", pmtx);
    Thread t2(BuyTickets, "thread-2", pmtx);
    Thread t3(BuyTickets, "thread-3", pmtx);
    Thread t4(BuyTickets, "thread-4", pmtx);


    t1.Start(), t2.Start(), t3.Start(), t4.Start();

    t1.Join(), t2.Join(), t3.Join(), t4.Join();

    pthread_mutex_destroy(pmtx);
    // int a = 10;
    // std::cout << &a << std::endl;
    return 0;
}

// int main() {
//     // std::vector<Thread> threads;

//     // for (int i = 0; i < tnum; i++) {
//     //     std::string name = "thread-" + std::to_string(i + 1);
//     //     threads.emplace_back(BuyTickets, name);
//     // }

//     // sleep(1);

//     // for (auto& t : threads) {
//     //     t.Start();
//     // }

//     // for (auto& t : threads) {
//     //     t.Join();
//     // }

//     // sleep(6);

//     // for (auto& t : threads) {
//     //     t.Stop();
//     // }


//     // Thread t1(BuyTickets, "thread-1");
//     // Thread t2(BuyTickets, "thread-2");
//     // Thread t3(BuyTickets, "thread-3");
//     // Thread t4(BuyTickets, "thread-4");


//     // t1.Start(), t2.Start(), t3.Start(), t4.Start();

//     // t1.Join(), t2.Join(), t3.Join(), t4.Join();

//     // t1.Start();
//     // sleep(1);
//     // t2.Start();
//     // sleep(1);
//     // t3.Start();
//     // sleep(1);
//     // t4.Start();

//     // // std::cout << t1.Status() << std::endl;

//     // sleep(5);
//     // t1.Stop(), t2.Stop(), t3.Stop(), t4.Stop();

//     // // std::cout << t1.Status() << std::endl;

//     // sleep(3);
//     // t1.Join(), t2.Join(), t3.Join(), t4.Join();

//     return 0;
// }